# -*- coding: utf-8 -*-

# Bliotecas padrões
from django.contrib.auth import authenticate, logout, login as authlogin
from django.shortcuts import render_to_response, get_object_or_404
from django.http import HttpResponse, HttpResponseRedirect
from django.template import Context, loader, RequestContext
from django.core.urlresolvers import reverse
from django.contrib.admin.models import User
from django.contrib.auth.decorators import permission_required
from datetime import *
from django.forms.util import ErrorList
from django.core.mail import send_mail, EmailMessage
from random import choice
import string

# Bibliotecas externas
from geraldo.generators import PDFGenerator

# Bibliotecas das apps
from reports import *
from myproject.settings import MEDIA_URL, MEDIA_ROOT
from forms import *
from extras import *

# Models
from myproject.cadastro.models import *
from myproject.aula.models import *

def login(request):
    erro = None
    if request.user.id:
        return render_to_response('cadastro/logado.html',{},context_instance=RequestContext(request))          
    if request.POST:
        emailUser = request.POST.get('email')
        senhaUser = request.POST.get('senha')
        u = authenticate(username=emailUser, password=senhaUser)
        if u is not None:
            if u.is_active:
                authlogin(request, u)
                for nome in request.GET:
                    if nome == 'next':
                        next = request.GET['next']
                        if next:
                            return HttpResponseRedirect(next)
                return render_to_response('cadastro/logado.html',{},context_instance=RequestContext(request))
            else:
                erro = 'Usuário/senha estão inválidos'
        else:
            erro = 'Usuário/senha estão inválidos'
    if erro:
        return render_to_response('cadastro/login.html',{},context_instance=RequestContext(request, {'erro':erro}))
    else:
        return render_to_response('cadastro/login.html',{},context_instance=RequestContext(request, {}))
        
def esqueceuSenha(request):
    
    if request.POST:
        f = EsqueceuSenhaModelForm(request.POST)
        if f.is_valid():
            l = User.objects.filter(email=request.POST.get('email'),
                                    username=request.POST.get('login')).count()
            if l:
                sai = True
                while sai:
                    length=10
                    chars=string.letters + string.digits
                    senha = ''.join([choice(chars) for i in range(length)])
                    numero = User.objects.filter(password=senha).count()
                    if not numero:
                        sai = False
                    
                l = User.objects.get(email=request.POST.get('email'))               
                login = l.username
                
                l.set_password(senha)
                l.save()
                
                assunto = 'Dados Hadassa Music'
                destinatario = 'diogoxm@gmail.com'
                email = request.POST.get('email')
                mensagem = u"""              
                .:: Seus dados ::.
                
                LOGIN: """ + login + u"""
                SENHA: """ + senha + u""" 
                
                Você pode alterar sua senha no site http://www.hadassanusic.com.br.
                
                """      
                send_mail(subject=assunto, message=mensagem, from_email=email, recipient_list=[destinatario])
            else:                
                msg = u'E-mail não existe'
                f._errors['email'] = ErrorList([msg])
                
    else:
        f = EsqueceuSenhaModelForm()
    return render_to_response('cadastro/esqueceuSenha/dados_usuario.html', {'form':f,},context_instance=RequestContext(request))

def sair(request):
    logout(request)
    return HttpResponseRedirect(reverse('cadastro.views.login'))
        
def alterarSenha(request):
    
    if request.POST:
        f = AlterarSenhaModelForm(request.POST)
        if f.is_valid():
            l = User.objects.filter(username=request.POST.get('login')).count()
            if l:
                l = User.objects.get(username=request.POST.get('login'))
                if l.check_password(request.POST.get('senha')):
                    l.set_password(request.POST.get('senhanova'))
                    l.save()
                    return HttpResponseRedirect(reverse('cadastro.views.login'))
                else:
                    msg = u'Senha ou login inválido'
                    f._errors['login'] = ErrorList([msg])                       
            else:                
                msg = u'Senha ou login inválido'
                f._errors['login'] = ErrorList([msg])                
    else:
        f = AlterarSenhaModelForm()
    return render_to_response('cadastro/alterarSenha/alterar_senha.html', {'form':f,},context_instance=RequestContext(request))

########################################
# Implementa as funcoes do model Aluno #
########################################
@permission_required('cadastro.per_administrador')
def aluno(request):
    form = AlunosModelForm()
    return render_to_response('cadastro/aluno.html', {'usuarios' : Alunos.objects.all(), 'form':form.as_table()},context_instance=RequestContext(request))

@permission_required('cadastro.per_administrador')  
def adicionar_aluno(request):
    if request.POST:
        # verifico a idade
        if request.POST.get('dataNascimento_day') <> '' or request.POST.get('dataNascimento_month') <> '' or request.POST.get('dataNascimento_year') <> '':
            if calculateAge( request.POST.get('dataNascimento_day'),request.POST.get('dataNascimento_month'),request.POST.get('dataNascimento_year') ) > 17:
                POST = request.POST.copy()
                if 	request.POST.get('nomeResponsavel') == '':
                    POST.__setitem__('nomeResponsavel',request.POST.get('nome'))
                if	request.POST.get('sobrenomeResponsavel') == '':
                    POST.__setitem__('sobrenomeResponsavel', request.POST.get('sobrenome'))
                if	request.POST.get('emailResponsavel') == '':
                    POST.__setitem__('emailResponsavel', request.POST.get('email'))
                if	request.POST.get('cpfResponsavel') == '':
                    POST.__setitem__('cpfResponsavel', request.POST.get('cpf'))
                if	request.POST.get('rgResponsavel') == '':
                    POST.__setitem__('rgResponsavel', request.POST.get('rg'))
                if	request.POST.get('dataNascimentoResponsavel_day') == '0':
                    POST.__setitem__('dataNascimentoResponsavel_day', request.POST.get('dataNascimento_day'))
                if	request.POST.get('dataNascimentoResponsavel_month') == '0':
                    POST.__setitem__('dataNascimentoResponsavel_month', request.POST.get('dataNascimento_month'))
                if	request.POST.get('dataNascimentoResponsavel_year') == '0':
                    POST.__setitem__('dataNascimentoResponsavel_year', request.POST.get('dataNascimento_year'))
                if	request.POST.get('enderecoResponsavel') == '':
                    POST.__setitem__('enderecoResponsavel', request.POST.get('endereco'))
                if	request.POST.get('cepResponsavel') == '':
                    POST.__setitem__('cepResponsavel', request.POST.get('cep'))
                if	request.POST.get('bairroResponsavel') == '':
                    POST.__setitem__('bairroResponsavel', request.POST.get('bairro'))
                if	request.POST.get('paisResponsavel') == '':
                    POST.__setitem__('paisResponsavel', request.POST.get('pais'))
                if	request.POST.get('estadoResponsavel') == '':
                    POST.__setitem__('estadoResponsavel', request.POST.get('estado'))
                if	request.POST.get('cidadeResponsavel') == '':
                    POST.__setitem__('cidadeResponsavel', request.POST.get('cidade'))
                if	request.POST.get('telefoneResponsavel') == '':
                    POST.__setitem__('telefoneResponsavel', request.POST.get('telefone'))
                f = AlunosModelForm(POST,request.FILES)
            else:
                f = AlunosRespModelForm(request.POST,request.FILES)
        else:
            f = AlunosModelForm(request.POST,request.FILES)
        if f.is_valid():
            a = f.save()
            cursos = Curso.objects.filter(alunos__id=a.id)
            for curso in cursos:
                c = AulaAluno(  aluno=a,\
                                curso=Curso.objects.get(id=curso.id),\
                                aula=Aula.objects.filter(curso__id=curso.id).order_by('id')[0])
                c.save()
            return HttpResponseRedirect(reverse('cadastro.views.aluno'))
    else:
        f = AlunosModelForm()
    return render_to_response('cadastro/aluno/adicionar_aluno.html',
                              {'form':f}
                              ,context_instance=RequestContext(request))

@permission_required('cadastro.per_administrador')
def mostra_dados_aluno(request, codigo):
  aluno = get_object_or_404(Alunos, pk=codigo)
  codigo = aluno.id
  if calculateAge( aluno.dataNascimento.day,aluno.dataNascimento.month,aluno.dataNascimento.year ) > 17:
    f = AlunosModelForm(instance=aluno)     
  else:
    f = AlunosRespModelForm(instance=aluno)
  return render_to_response('cadastro/aluno/aluno_dados.html', {'form':f, 'codigo':codigo},context_instance=RequestContext(request))   

@permission_required('cadastro.per_administrador')
def alterar_aluno(request, codigo):
    aluno = get_object_or_404(Alunos, id=codigo)
    # Verfica a idade
    if request.POST.get('dataNascimento_day') <> '' or request.POST.get('dataNascimento_month') <> '' or request.POST.get('dataNascimento_year') <> '':
        if calculateAge( request.POST.get('dataNascimento_day'),request.POST.get('dataNascimento_month'),request.POST.get('dataNascimento_year') ) > 17:
            POST = request.POST.copy()
            if 	request.POST.get('nomeResponsavel') == '':
                POST.__setitem__('nomeResponsavel',request.POST.get('nome'))
            if	request.POST.get('sobrenomeResponsavel') == '':
                POST.__setitem__('sobrenomeResponsavel', request.POST.get('sobrenome'))
            if	request.POST.get('emailResponsavel') == '':
                POST.__setitem__('emailResponsavel', request.POST.get('email'))
            if	request.POST.get('cpfResponsavel') == '':
                POST.__setitem__('cpfResponsavel', request.POST.get('cpf'))
            if	request.POST.get('rgResponsavel') == '':
                POST.__setitem__('rgResponsavel', request.POST.get('rg'))
            if	request.POST.get('dataNascimentoResponsavel_day') == '0':
                POST.__setitem__('dataNascimentoResponsavel_day', request.POST.get('dataNascimento_day'))
            if	request.POST.get('dataNascimentoResponsavel_month') == '0':
                POST.__setitem__('dataNascimentoResponsavel_month', request.POST.get('dataNascimento_month'))
            if	request.POST.get('dataNascimentoResponsavel_year') == '0':
                POST.__setitem__('dataNascimentoResponsavel_year', request.POST.get('dataNascimento_year'))                
            if	request.POST.get('enderecoResponsavel') == '':
                POST.__setitem__('enderecoResponsavel', request.POST.get('endereco'))
            if	request.POST.get('cepResponsavel') == '':
                POST.__setitem__('cepResponsavel', request.POST.get('cep'))
            if	request.POST.get('bairroResponsavel') == '':
                POST.__setitem__('bairroResponsavel', request.POST.get('bairro'))
            if	request.POST.get('paisResponsavel') == '':
                POST.__setitem__('paisResponsavel', request.POST.get('pais'))
            if	request.POST.get('estadoResponsavel') == '':
                POST.__setitem__('estadoResponsavel', request.POST.get('estado'))
            if	request.POST.get('cidadeResponsavel') == '':
                POST.__setitem__('cidadeResponsavel', request.POST.get('cidade'))
            if	request.POST.get('telefoneResponsavel') == '':
                POST.__setitem__('telefoneResponsavel', request.POST.get('telefone'))
            f = AlunosModelForm(POST,request.FILES, instance=aluno)
        else:
            f = AlunosRespModelForm(request.POST,request.FILES, instance=aluno)
    else:
        f = AlunosModelForm(request.POST,request.FILES, instance=aluno)
            
    if f.is_valid():
        a = f.save()
        cursos = Curso.objects.filter(alunos__id=a.id)
        for curso in cursos:
            c = AulaAluno(  aluno=a,\
                            curso=Curso.objects.get(id=curso.id),\
                            aula=Aula.objects.filter(curso__id=curso.id).order_by('id')[0])
            c.save()
        return HttpResponseRedirect(reverse('cadastro.views.aluno'))
    return render_to_response('cadastro/aluno/adicionar_aluno.html'
                              ,{'form':f,}
                              ,context_instance=RequestContext(request))

@permission_required('cadastro.per_administrador')
def apagar_aluno(request, codigo):
    aluno = get_object_or_404(Alunos, pk=codigo)
    user = get_object_or_404(User, pk=aluno.user.id)
    aluno.delete()
    user.delete()
    return HttpResponseRedirect(reverse('cadastro.views.aluno'))

############################################
# Implementa as funcoes do model AulaAluno #
############################################
@permission_required_tcc(['cadastro.per_professor','cadastro.per_administrador'])
def aulaAluno(request):
    return render_to_response(  'cadastro/aulaAluno.html'\
                              , {'usuarios' : Alunos.objects.filter(status=True)}\
                              , context_instance=RequestContext(request))
    
@permission_required_tcc(['cadastro.per_professor','cadastro.per_administrador'])
def aulaAlunoCurso(request):
    qs = Curso.objects.filter(professor__user__id=request.user.id)
    return render_to_response('cadastro/aulaAlunoCurso.html', {'cursos' : qs}
                              ,context_instance=RequestContext(request))
    
@permission_required('cadastro.per_aluno')
def aulaAlunoAulas(request):
    qs = AulaAluno.objects.filter(aluno__user__id=request.user.id)
    return render_to_response('cadastro/aulaAlunoAulas.html', {'aulas' : qs}
                              ,context_instance=RequestContext(request)) 

@permission_required_tcc(['cadastro.per_professor','cadastro.per_administrador'])
def aulaAlunoProfessor(request,cod_curso):
    qs = Alunos.objects.filter(user__is_active=True,\
                               curso__id=cod_curso)
    return render_to_response(  'cadastro/aulaAluno.html'\
                              , {'usuarios' : qs }\
                              , context_instance=RequestContext(request))    

@permission_required_tcc(['cadastro.per_professor','cadastro.per_administrador'])
def cursosAluno(request,cod_aluno):
    return render_to_response(  'cadastro/aulaAluno/cursosAluno.html'\
                              , {'cod_aluno':cod_aluno,'usuarios' : Curso.objects.filter(alunos__id=cod_aluno,professor__user__id=request.user.id)}\
                              , context_instance=RequestContext(request))

@permission_required_tcc(['cadastro.per_professor','cadastro.per_administrador'])
def alterar_aulaAluno(request, cod_aluno, cod_curso):
    print AulaAluno.objects.filter(aluno__id=cod_aluno, curso__id=cod_curso).count()
    aulaAluno = get_object_or_404(AulaAluno , aluno__id=cod_aluno
                                            , curso__id=cod_curso)
    if request.POST:
        f = AulaAlunoModelForm(request.POST, request.FILES, instance=aulaAluno)
        if f.is_valid():		
            professor = f.save()
            return HttpResponseRedirect(reverse('cadastro.views.aulaAluno'))
    else:
        f = AulaAlunoModelForm(instance=aulaAluno)
    return render_to_response(      'cadastro/aulaAluno/alterar_cursosAluno.html'\
                                ,   {'form':f, 'cod_aluno':cod_aluno,'cod_curso':cod_curso}\
                                ,   context_instance=RequestContext(request))

@permission_required_tcc(['cadastro.per_professor','cadastro.per_administrador'])
def presenca(request, cod_aluno, cod_curso ):
    return render_to_response(      'cadastro/presenca.html'\
                                ,   {'usuarios' : Presenca.objects.filter( aluno__id=cod_aluno, curso__id=cod_curso)}\
                                ,   context_instance=RequestContext(request))



@permission_required_tcc(['cadastro.per_professor','cadastro.per_administrador'])
def alterar_presenca(request, codigo ):
    presenca =  get_object_or_404(Presenca  , id=codigo )
    if request.POST:
        f = PresencaModelForm(request.POST, request.FILES, instance=presenca)
        if f.is_valid():		
            professor = f.save()
            if request.user.has_perm('cadastro.per_administrador'):
                return HttpResponseRedirect(reverse('cadastro.views.aulaAluno'))
            else:
                return HttpResponseRedirect(reverse('cadastro.views.aulaAlunoCurso'))
    else:
        f = PresencaModelForm(instance=presenca)
    return render_to_response(      'cadastro/presenca/alterar_presenca.html'\
                                ,   {'form':f, 'codigo':presenca.id,}\
                                ,   context_instance=RequestContext(request))

@permission_required_tcc(['cadastro.per_professor','cadastro.per_administrador'])
def apagar_presenca(request, codigo):
    presenca = get_object_or_404(Presenca, pk=codigo)
    presenca.delete()
    return HttpResponseRedirect(reverse('cadastro.views.aulaAluno'))
    
    

@permission_required_tcc(['cadastro.per_professor','cadastro.per_administrador'])
def nota(request, cod_aluno, cod_curso ):
    print Nota.objects.filter( aluno__id=cod_aluno, curso__id=cod_curso).count()
    return render_to_response(  'cadastro/nota.html'\
                                ,{'usuarios' : Nota.objects.filter( aluno__id=cod_aluno, curso__id=cod_curso)
                                ,'cod_aluno':cod_aluno\
                                ,'cod_curso':cod_curso }\
                                ,context_instance=RequestContext(request))

@permission_required_tcc(['cadastro.per_professor','cadastro.per_administrador'])
def adicionar_nota(request, cod_aluno, cod_curso):
    if request.POST:
        f = NotaModelForm(request.POST,request.FILES, cod_aluno=cod_aluno, cod_curso=cod_curso)
        if f.is_valid():
            n = f.save()
            return render_to_response(   'cadastro/nota.html'\
                                        ,{'usuarios' : Nota.objects.filter( aluno__id=n.aluno.id, curso__id=n.curso.id)
                                        ,'cod_aluno':cod_aluno\
                                        ,'cod_curso':cod_curso}
                                        ,context_instance=RequestContext(request))      
    else:
        f = NotaModelForm(cod_aluno=cod_aluno, cod_curso=cod_curso)
    return render_to_response(  'cadastro/nota/adicionar_nota.html'
                                , {'form':f\
                                ,'cod_aluno':cod_aluno\
                                ,'cod_curso':cod_curso}
                                ,context_instance=RequestContext(request))

@permission_required_tcc(['cadastro.per_professor','cadastro.per_administrador'])
def mostra_dados_nota(request, codigo):
    nota = get_object_or_404(Nota, pk=codigo)
    codigo = nota.id
    f = NotaModelForm(instance=nota)
    return render_to_response(  'cadastro/nota/nota_dados.html'
                                ,{'form':f, 'codigo':codigo
                                ,'cod_aluno':nota.aluno.id\
                                ,'cod_curso':nota.curso.id}
                                ,context_instance=RequestContext(request))   

@permission_required_tcc(['cadastro.per_professor','cadastro.per_administrador'])
def alterar_nota(request, codigo):
    nota = get_object_or_404(Nota, pk=codigo)
    f = NotaModelForm(request.POST, request.FILES, instance=nota)
    if f.is_valid():		
        n = f.save()
        return render_to_response(  'cadastro/nota.html'\
                                    ,{'usuarios' : Nota.objects.filter( aluno__id=n.aluno.id, curso__id=n.curso.id)
                                    ,'cod_aluno':nota.aluno.id\
                                    ,'cod_curso':nota.curso.id}
                                    ,context_instance=RequestContext(request))     
    return render_to_response(  'cadastro/nota/nota_dados.html',
                                {'form':f, 'codigo':codigo
                                ,'cod_aluno':nota.aluno.id\
                                ,'cod_curso':nota.curso.id}
                                ,context_instance=RequestContext(request))   

@permission_required_tcc(['cadastro.per_professor','cadastro.per_administrador'])
def apagar_nota(request, codigo):
    nota = get_object_or_404(Nota, pk=codigo)
    idAluno = nota.aluno.id
    idCurso = nota.curso.id
    nota.delete()
    return render_to_response(  'cadastro/nota.html'\
                                , {'usuarios' : Nota.objects.filter( aluno__id=idAluno, curso__id=idCurso)
                                ,'cod_aluno':idAluno\
                                ,'cod_curso':idCurso}
                                , context_instance=RequestContext(request))  
    

  
############################################
# Implementa as funcoes do model Professor #
############################################
@permission_required('cadastro.per_administrador')
def professor(request):
    alunos = Professor.objects.all()
    for aluno in alunos:
        print aluno.user.is_active
    return render_to_response('cadastro/professor.html', {'usuarios' : Professor.objects.filter()}
                              ,context_instance=RequestContext(request))

@permission_required('cadastro.per_administrador')  
def adicionar_professor(request):
    if request.POST:
        f = ProfessorModelForm(request.POST,request.FILES)
        if f.is_valid():           
            c = f.save()                               
            return HttpResponseRedirect(reverse('cadastro.views.professor'))
    else:
        f = ProfessorModelForm()
    return render_to_response('cadastro/professor/adicionar_professor.html', {'form':f,},context_instance=RequestContext(request))

@permission_required('cadastro.per_administrador')
def mostra_dados_professor(request, codigo):
    professor = get_object_or_404(Professor, pk=codigo)
    codigo = professor.id
    f = ProfessorModelForm(instance=professor)
    return render_to_response('cadastro/professor/professor_dados.html', {'form':f, 'codigo':codigo}
                              ,context_instance=RequestContext(request))   

@permission_required('cadastro.per_administrador')
def alterar_professor(request, codigo):
    professor = get_object_or_404(Professor, pk=codigo)
    f = ProfessorModelForm(request.POST, request.FILES, instance=professor)
    if f.is_valid():
        c = f.save()
        return HttpResponseRedirect(reverse('cadastro.views.professor'))
    return render_to_response('cadastro/professor/professor_dados.html', {'form':f, 'codigo':codigo},context_instance=RequestContext(request))   

@permission_required('cadastro.per_administrador')
def apagar_professor(request, codigo):
    professor = get_object_or_404(Professor, pk=codigo)
    user = get_object_or_404(User, pk=professor.user.id)
    professor.delete()
    user.delete()
    return HttpResponseRedirect(reverse('cadastro.views.professor'))

@permission_required('cadastro.per_administrador')
def cursosProfessor(request, codigo):
    f = CursosProfessorModelForm()
    return render_to_response(  'cadastro/cursosProfessor.html'
                                ,{'usuarios' : CursosProfessor.objects.filter(professor=codigo)
                                ,'codigo':codigo
                                ,'form':f}
                                ,context_instance=RequestContext(request))

@permission_required('cadastro.per_administrador')  
def adicionar_cursosProfessor(request, codigo):
    if request.POST:
        f = CursosProfessorModelForm(request.POST,request.FILES)
        if f.is_valid():
            c = f.save(commit=False)
            prof = Professor.objects.get(id=codigo)
            c.professor = prof
            f.save()
            return HttpResponseRedirect(reverse('cadastro.views.cursosProfessor'))
    else:
        f = CursosProfessorModelForm()
    return render_to_response('cadastro/professor/adicionar_cursosProfessor.html', {'form':f,},context_instance=RequestContext(request))

@permission_required('cadastro.per_administrador')
def mostra_dados_cursosProfessor(request, codigo):
    professor = get_object_or_404(CursosProfessor, pk=codigo)
    codigo = professor.id
    f = CursosProfessorModelForm(instance=professor)
    return render_to_response('cadastro/professor/cursosProfessor_dados.html', {'form':f, 'codigo':codigo},context_instance=RequestContext(request))   

@permission_required('cadastro.per_administrador')
def alterar_cursosProfessor(request, codigo):
    professor = get_object_or_404(CursosProfessor, pk=codigo)
    f = CursosProfessorModelForm(request.POST, request.FILES, instance=professor)
    if f.is_valid():		
        professor = f.save()
        return HttpResponseRedirect(reverse('cadastro.views.professor'))
    return render_to_response('cadastro/professor/cursosProfessor_dados.html', {'form':f, 'codigo':codigo},context_instance=RequestContext(request))   

@permission_required('cadastro.per_administrador')
def apagar_cursosProfessor(request, codigo):
    professor = get_object_or_404(Professor, pk=codigo)
    professor.delete()
    return HttpResponseRedirect(reverse('cadastro.views.cursosProfessor'))
 
################################################
# Implementa as funcoes do model Administrador #
################################################
@permission_required('cadastro.per_administrador')
def administrador(request):
    return render_to_response('cadastro/administrador.html'
                              ,{'usuarios' : Administrador.objects.all()}
                              ,context_instance=RequestContext(request))

@permission_required('cadastro.per_administrador')
def adicionar_administrador(request):
    if request.POST:
        f = AdministradorModelForm(request.POST)

        if f.is_valid():
            c = f.save()
            return HttpResponseRedirect(reverse('cadastro.views.administrador'))
    else:
        f = AdministradorModelForm()
    return render_to_response('cadastro/administrador/adicionar_administrador.html'
                              ,{'form':f,},context_instance=RequestContext(request))

@permission_required('cadastro.per_administrador')
def mostra_dados_administrador(request, codigo):
	administrador = get_object_or_404(Administrador, pk=codigo)
	codigo = administrador.id
	f = AdministradorModelForm(instance=administrador)
	return render_to_response('cadastro/administrador/administrador_dados.html', {'form':f, 'codigo':codigo},context_instance=RequestContext(request))   

@permission_required('cadastro.per_administrador')
def alterar_administrador(request, codigo):
    administrador = get_object_or_404(Administrador, pk=codigo)
    f = AdministradorModelForm(request.POST, instance=administrador)
    if f.is_valid():
        administrador = f.save()
        return HttpResponseRedirect(reverse('cadastro.views.administrador'))
    return render_to_response('cadastro/administrador/adicionar_administrador.html', {'form':f,},context_instance=RequestContext(request))

@permission_required('cadastro.per_administrador')
def apagar_administrador(request, codigo):
    administrador = get_object_or_404(Administrador, pk=codigo)
    user = get_object_or_404(User, pk=administrador.user.id)
    administrador.delete()
    user.delete()
    return HttpResponseRedirect(reverse('cadastro.views.administrador'))

######################################
# Implementa as funcoes de relatorio #
######################################
@permission_required_tcc(['cadastro.per_professor','cadastro.per_administrador'])
def Relatorio_Aluno(request):
    resp = HttpResponse(mimetype='alunos.pdf')

    alunos = Alunos.objects.filter(status=True).order_by(u'nome')
    rel = RelatorioAluno(queryset=alunos)
    rel.generate_by(PDFGenerator, filename=resp)

    return resp

@permission_required_tcc(['cadastro.per_professor','cadastro.per_administrador'])
def Relatorio_Admin(request):
    resp = HttpResponse(mimetype='administradores.pdf')

    admin = Administrador.objects.order_by(u'nome')
    rel = RelatorioAdmin(queryset=admin)
    rel.generate_by(PDFGenerator, filename=resp)

    return resp

@permission_required_tcc(['cadastro.per_professor','cadastro.per_administrador'])
def Relatorio_Prof(request):
    resp = HttpResponse(mimetype='prefessores.pdf')

    prof = Professor.objects.order_by(u'nome')
    rel = RelatorioProfessor(queryset=prof)
    rel.generate_by(PDFGenerator, filename=resp)

    return resp

@permission_required_tcc(['cadastro.per_professor','cadastro.per_administrador'])
def Relatorio_nota(request):
    if request.POST:
        f = RelNotaForm(request.POST)
        if f.is_valid():
            resp = HttpResponse(mimetype='nota.pdf')
            nota = Alunos.objects.all().order_by(u'nome')
            if request.POST.get('curso'):
                nota = Alunos.objects.filter(curso=request.POST.get('curso')).order_by(u'nome')
            if request.POST.get('aluno'):
                nota = Alunos.objects.filter(id=request.POST.get('aluno')).order_by(u'nome')
            rel = Rel_Aproveitamento(queryset=nota)
            rel.generate_by(PDFGenerator, filename=resp)        
            return resp
    else:
        f = RelNotaForm()
    return render_to_response('cadastro/relatorios/nota.html'
                              ,{'form':f,},context_instance=RequestContext(request))

@permission_required_tcc(['cadastro.per_professor','cadastro.per_administrador'])
def Relatorio_historico(request):
    if request.POST:
        f = RelHistoricoForm(request.POST)
        if f.is_valid():
            resp = HttpResponse(mimetype='historico.pdf')
            hist = Alunos.objects.filter(status=True).order_by(u'nome')
            if request.POST.get('curso'):
                hist = Alunos.objects.filter(curso=request.POST.get('curso')).order_by(u'nome')
            if request.POST.get('aluno'):
                hist = Alunos.objects.filter(id=request.POST.get('aluno')).order_by(u'nome')
            rel = Rel_Historico(queryset=hist)
            rel.generate_by(PDFGenerator, filename=resp)
            return resp
    else:
        f = RelHistoricoForm()
    return render_to_response('cadastro/relatorios/historico.html'
                              ,{'form':f,},context_instance=RequestContext(request))    